package cn.han.review;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

//用于测试暴力反射
public class TestReflection2 {
    /*1.通过暴力反射获取与操作属性*/
    @Test
    public void getFild() throws Exception {
        Class<?> clazz = Person.class;
        Field field = clazz.getDeclaredField("name");
        System.out.println(field.getType().getName());
        System.out.println(field.getType());

        //设置属性的值
        Object obj = clazz.newInstance();
        //暴力反射，需要设置私有可见权限！！！
        field.setAccessible(true);
        //通过字段对象给刚刚创建好的对象obj设置属性值
        //set(m,n)--m是给哪个对象的name属性设置，n是设置的值是什么
        field.set(obj, "海绵宝宝");
        System.out.println(field.get(obj));
    }
    @Test
    public void getFild3() throws Exception {
        Class<?> clazz = Person.class;
        Field f = clazz.getDeclaredField("age");
        System.out.println(f.getType().getName());
        Object o = clazz.newInstance();
        f.setAccessible(true);
        f.set(o,3);
        System.out.println(f.get(o));
    }
    //3.创建单元测试方法，通过暴力反射获取与执行Person类的私有方法
    @Test
    public void getFunction() throws Exception {
        Class<?> clazz = Person.class;
        Method method = clazz.getDeclaredMethod("save", int.class, String.class);
        method.setAccessible(true);

        Object obj = clazz.newInstance();
        method.invoke(obj,666,"哈哈哈");


    }

}
